• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Doppelte Hochkommata in NSString für HTTP-POST

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Hallo Leute,

will mit einem Server per HTTP-Post kommunizieren, habe deswegen als method POST im Header definiert, den Body als String mit den Werten, die ich dem Server schicken will gegeben. Aber irgendwie kommen die Daten nicht an. Deswegen bin ich mal flux auf die Idee gekommen, dass es doch daran liegen könnte das ich immer nur geschrieben habe
Code:
parameter1=wert1&parameter2=wert2...
. Wenn ich aber die Werte jetzt in doppelte Hochkommata stelle, dass es dann eventuell funktionieren könnte? Aber wie mache ich das, also einen String mit doppelten Hochkommata wie
Code:
@"parameter1="wert1"&...
? Also Wie gesagt, ich habe keine Ahnung von HTTP, mir ist das alles sehr fremd was Client-Server-Kommunikation angeht, lerne deswegen grade auch PHP ist aber noch nicht so weit...Würde mich sehr freuen, wenn ihr mir da helfen könntet , vielleicht habe ich ja auch was mit der Request falsch gemacht...
Hier mal der komplette Code:
Code:
NSURL *url = [NSURL URLWithString:@"http://myDomain.de/index.php?poster=entry"];
	
	NSMutableURLRequest *addEntryRequest = [NSMutableURLRequest requestWithURL:url];
	
	[addEntryRequest setHTTPMethod:@"POST"];
	
	NSString *requestBody = [[NSString alloc]
							 
							 initWithFormat:@"action=add&date=%@&time=%&subject=%@&sub=%@&oldroom=%@&teacher=%@&course=%@&duration=%@&change=%@&newroom=%@",
							 
							 [self.dateTextField text], [firstDict objectForKey:@"time"], [firstDict objectForKey:@"subject"], [self.subTextField text], [self.oldroomTextField text], [firstDict objectForKey:@"teacher"], [firstDict objectForKey:@"course"], [self.durationTextField text], [firstDict objectForKey:@"change"], [self.newroomTextField text]];
	
	NSLog(@"requestBody: %@", requestBody);
	[addEntryRequest setHTTPBody:[requestBody dataUsingEncoding:NSASCIIStringEncoding]];
	
	NSHTTPURLResponse *response = NULL;
	
	NSData *responseData = [NSURLConnection sendSynchronousRequest:addEntryRequest returningResponse:response error:nil];
	
	NSString *responseDataString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
	NSLog(@"response: %@", responseDataString);
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Wenn Du Anführungszeichen in einem String haben willst, muss Du diese im Code maskieren. Beispiel:
Code:
@"Ein String mit \"Anführungszeichen\""
MacApple
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

nelfisch beschreibt in etwa das wo ich noch hinkommen muss.
Ich möchte meinem Server auch einfach nur textdaten (Strings) schicken die dann z.B. in einem Textfeld auf einer Webseite angezeigt werden.
Leider weiß ich nicht wie ich den Request konstruieren muss.
folgenden Code habe ich bereits:
Code:
char bytes[] = "This is a test.";
    NSData *mydata = [NSData dataWithBytes:bytes length:15];
    
    NSMutableURLRequest *theRequest =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://myserver.de/"]];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody:mydata];
ganz offensichtlich fehlt etwas beim Request und mit NSURLConnection muss ich ja auch noch was machen.
Kann mir da jemand Tipps geben? wäre echt froh.
 
Zuletzt bearbeitet:

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Ja das kenne ich natürlich schon, aber da ist nur vom Download die rede, der Upload verhält sich ja doch immer etwas anders. Anscheinend weiß das hier auch keiner, ich werd dann dort nochmal schauen, trotzdem danke.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Das solltest du mit einem normalen Request mit POST-Daten und einem PHP-Skript auf dem Server schon hinkriegen!

Gruss ppocket
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Eine andere Möglichkeit ist, das in C umzusetzen. Ich hab das da mal versucht:

Code:
// standard libraries:
#include <stdio.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>

#define PORTNUM 80
#define BUFSIZE 512

int main(int argc, char *argv[]) {
	// set up a buffer for the response:
	char *buffer = malloc(BUFSIZE * sizeof(char));
	
	// set up the content:
	char *content = "name=polj&password=1234\n";
	
	// set up the request:
	char *request1 = "POST /ctest.php HTTP/1.1\n";
	char *request2 = "Host: *****:80\n";
	char *request3 = "Content-Type: application/x-www-form-urlencoded\n";
	char *request4 = malloc(25 * sizeof(char));
	sprintf(request4, "Content-Length: %d\n", (int)strlen(content));
	char *request5 = "Connection: close\n";
	
	// set up a connection address:
	struct sockaddr_in host_address;
	
	// setting up server socket:
	int client_socket;
	client_socket = socket(AF_INET, SOCK_STREAM, 0);
	
	// make a address:
	struct hostent *host;
	host = gethostbyname("*****");
	
	// setting up the server address (internet, the address, port):
	host_address.sin_family = AF_INET;
	host_address.sin_addr = *(struct in_addr *)host->h_addr;
	host_address.sin_port = htons(PORTNUM);
	
	// bind the socket to the address:
	connect(client_socket, (struct sockaddr *)&host_address, sizeof(host_address));
	
	// start:
	printf("\n---- Request ----\n");
	
	// send the request:
	send(client_socket, request1, strlen(request1), 0);
	printf("%s", request1);
	send(client_socket, request2, strlen(request2), 0);
	printf("%s", request2);
	send(client_socket, request3, strlen(request3), 0);
	printf("%s", request3);
	send(client_socket, request4, strlen(request4), 0);
	printf("%s", request4);
	send(client_socket, request5, strlen(request5), 0);
	printf("%s", request5);
	// end the request (in HTTP, with a blank line):
	send(client_socket, "\n", 1, 0);
	printf("\n");
	// the server now wants the data, send it:
	send(client_socket, content, strlen(content), 0);
	printf("%s", content);
	
	// getting the response from the server:
	recv(client_socket, buffer, BUFSIZE, 0);
	
	// print the response:
	printf("\n-- Response --\n");
	printf("%s", buffer);
	
	printf("\n-- End --\n\n");
	
	// shut the socket, free the memory:
	shutdown(client_socket, 2);
	free(buffer);
	free(request4);
	
	return 0; 
}

Wobei ich auf dem Server (*****) die Datei ctest.php im root-Verzeichnis erstellt habe, Inhalt:

Code:
<?php

echo('name is: ' . $_POST['name']. "\n");
echo('password is: ' . $_POST['password']);

?>

Und es funktioniert :) Damit kannst du also ein HTTP-POST Formular simulieren und so auch deinen String dem Server schicken. Und der Server antwortet dann, hier in diesem Fall mit ein paar Headern und dem Inhalt, welcher ich durch das PHP erzeuge. An dieser Stelle kannst du aber auch eine Datei verändern, usw... Theorie zum verwendeten POST HTTP-Requests gibts hier: HTTP made really easy.

Gruss ppocket
 
Zuletzt bearbeitet: