我有一个 HttpClient (由 IHttpClientFactory 生成),其 BaseAddress 为“www.mydomain.com/3.0/”。我将使用不同的方法使用不同的路径来访问该客户端。所以我首先设置一个 HttpRequestMessage。我注意到这两个实现的行为不同。
这:
var message = new HttpRequestMessage(HttpMethod.Get, $"account-lookup/?query={email}")
{
Headers =
{
{ key, value }
}
};
Run Code Online (Sandbox Code Playgroud)
作品。但是这个:
var message = new HttpRequestMessage()
{
Method = HttpMethod.Get,
Headers =
{
{ key, value }
},
RequestUri = new Uri($"account-lookup/?query={email}")
};
Run Code Online (Sandbox Code Playgroud)
返回异常Invalid URI: The format of the URI could not be determined.
我们不能用这样的字符串创建一个新的 Uri,不是吗?为什么我们没有一个属性或方法来让我们传递路径字符串?我假设 HttpRequestMessage 的构造函数在内部将传递的属性附加或连接到 BaseAddress?
我可以/应该做类似的事情
RequestUri = new Uri(Client.BaseAddress + $"account-lookup/?query={email}")
,但是以某种方式附加路径字符串会很好。
我有一个非常简单的控制台应用程序,用户可以在其中输入 Twitch 用户的名称,以查看是否存在具有该名称的 Twitch 个人资料。这是代码:
while (true)
{
string username = Console.ReadLine();
HttpClient client = new HttpClient();
string result = await client.GetStringAsync($"https://www.twitch.tv/{username}");
Console.WriteLine("User exists: " + !result.Contains("Twitch is the world"));
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
仅当提供的网址未指向现有个人资料时,文本“Twitch is the world”才会存在于结果中。我遇到的问题是 HttpClient 似乎只在第一次返回“正确”的结果。例如,我启动程序并输入“xqc”。这会给我结果
User exists: True
Run Code Online (Sandbox Code Playgroud)
但是,如果我现在尝试再次输入“xqc”(或任何其他现有的配置文件名称),它总是会产生以下结果
User exists: False
Run Code Online (Sandbox Code Playgroud)
我检查了实际的字符串,它发生的原因是,由于某种原因,第一个请求之后发出的每个请求都会返回 Twitch 的个人资料未找到页面。我不明白为什么会发生这种情况。是否有我遗漏的东西,或者我应该在这里使用其他东西而不是 HttpClient?
这是我的代码:
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
Run Code Online (Sandbox Code Playgroud)
这适用于我迄今为止尝试的每个网址,除了一些包含锚点的网址.这些锚定网址中的一些返回400.奇怪的是,并非所有包含锚点的链接,其中很多都可以正常工作.
不幸的是,我必须非常一般,因为我无法在这里提供具体的网址.
链接完全有效,并且在任何浏览器中都可以正常工作,但HttpClient在尝试链接时返回400.如果我删除锚,它将工作.
任何想法要找什么?
例如: http://www.somedomain.com/somedirectory/somepage#someanchor
对于仿制药再次抱歉
编辑:我应该提到这是为Android.
假设我们有一个字符串"http://www.example.com/feed".我将这个字符串分成三部分用于Apache的URI类:1."http"2."www.example.com"3."/ feed"
对于将URI分解为其组件的过程,是否有适当的术语?
我正在与一个我无法更改的API进行通信,当API请求未在API端验证时,该API会发送400响应.它是有效的HTTP请求,但请求数据未通过应用程序的验证规则.
400响应包含一个JSON有效负载,其中包含有关请求未通过验证的原因的信息.
我似乎无法获得响应体,因为抛出了HttpRequestException.有人知道如何检索这个响应体吗?
try {
HttpUriRequest request = params[0];
HttpResponse serverResponse = mClient.execute(request);
BasicResponseHandler handler = new BasicResponseHandler();
String response = handler.handleResponse(serverResponse);
return response;
} catch(HttpResponseException e) {
// Threw HttpError
Log.d(TAG, "HttpResponseException : " + e.getMessage());
Log.d(TAG, "Status Code : " + e.getStatusCode());
// TODO API returns 400 on successful HTTP payload, but invalid user data
if(e.getStatusCode() == 400) {
// Information on API error inside Response body
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Android手机上创建一个从用户获取用户名和密码的应用程序,使用md5加密密码,然后使用这些参数连接到url.
一个连接的代码在iphone上工作正常,但我在android中找不到类似的东西:
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:myURL];
[request setHTTPMethod:@"GET"];
[request addValue:usernameField.text forHTTPHeaderField:@"UserName"];
[request addValue:MD5Pass2 forHTTPHeaderField:@"Password"];
Run Code Online (Sandbox Code Playgroud)
我试图通过httpurlconnection连接使用post/get Dataoutputstream,httpclient发送参数httpget/httppost,但没有成功.
我想我需要将参数作为headerfield发送,但我不知道如何.
注意:我比较了加密结果,这是正确的.
我正在使用libebb(http://tinyclouds.org/libebb/)和libev编写一个Web服务器.我正在寻找一个使用libev事件循环的异步httpclient.
我希望它支持Http 1.1(流水线,保持活动等).
我希望这不是一个愚蠢的问题.
我的Windows Phone客户端发送一段代表名称和分数的JSON ......我应该使用Web API中的Class吗?将对象发送到服务器而不是原始json的代码是什么?
private void btnCreateSampleScore_Click(object sender, RoutedEventArgs e)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://punkoutersoftware.azurewebsites.net");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("Bob", "2.65")
});
var result = client.PostAsync("/api/DrunkMeterScore", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(resultContent);
//DrunkMeterScore dms = new DrunkMeterScore();
//dms.Name = "Bob";
//dms.Score = 2.42;
}
}
Run Code Online (Sandbox Code Playgroud)
服务器正在使用纯Web API模板
// POST api/DrunkMeterScore
public HttpResponseMessage PostDrunkMeterScore(DrunkMeterScore drunkmeterscore)
{
if (ModelState.IsValid)
{
db.DrunkMeterScores.Add(drunkmeterscore);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, drunkmeterscore);
response.Headers.Location = new Uri(Url.Link("DefaultApi", …Run Code Online (Sandbox Code Playgroud) 我们想在我们的服务器上运行一个php脚本,使用HttpClient和HttpPost将数据(在变量nameValuePairs中)插入到我们的数据库中.如果我们使用Idea IntelliJ创建以下代码作为Android应用程序,它可以正常工作.但是如果它是在Eclipse中创建的,则应用程序会在.execute()方法中崩溃,并抛出一个正常的异常"null".
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
Run Code Online (Sandbox Code Playgroud)
您是否熟悉该问题或为什么在Eclipse中创建的相同程序崩溃并在IntelliJ中运行?
编辑:这是Eclipse中的错误日志:
04-04 08:11:33.429: E/AndroidRuntime(2888): FATAL EXCEPTION: main
04-04 08:11:33.429: E/AndroidRuntime(2888): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobile.inserttest/com.mobile.inserttest.MainActivity}: android.os.NetworkOnMainThreadException
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.os.Looper.loop(Looper.java:137)
04-04 08:11:33.429: E/AndroidRuntime(2888): at android.app.ActivityThread.main(ActivityThread.java:4441)
04-04 08:11:33.429: E/AndroidRuntime(2888): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 08:11:33.429: E/AndroidRuntime(2888): at java.lang.reflect.Method.invoke(Method.java:511)
04-04 …Run Code Online (Sandbox Code Playgroud) 我需要使用httpclient进入foreach循环。有可能的?正确的方法是什么?这是我的代码:
this.attachToDelete.forEach(
element => {
this.documentService.DeleteAttachment(element, this.newDocumentId.toString());
console.log("upload delete from submit", element);
}
);
Run Code Online (Sandbox Code Playgroud)
这是对应服务中的方法:
public DeleteAttachment(attachmentId: number, documentId: string) {
let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/json; charset=utf-8');
return this.http.post('http://localhost:8080/DocumentAPI/api/document/RemoveAttachment?docId=' + documentId + '&attachmentId='+attachmentId, attachmentId, { headers: headers }).subscribe(
data => {
if(data)
console.log("delete attach????", data);
else{
console.log('Error occured');
}
}
);
}
Run Code Online (Sandbox Code Playgroud) httpclient ×10
android ×4
c# ×2
java ×2
post ×2
anchor ×1
angular ×1
call ×1
eclipse ×1
http ×1
http-headers ×1
httprequest ×1
libev ×1
libevent ×1
rxjs ×1
uri ×1
url ×1
web-scraping ×1