这不是一个真正的问题,但是,我想在这里分享一些我的工作代码供您参考.
据我们所知,HttpEntityAPI22已弃用,自API23以来已完全删除.目前,我们无法再访问Android Developer上的HttpEntity Reference(404).因此,以下是我使用Volley和没有HttpEntity的POST多部分请求的工作示例代码.它正在运行,经过测试Asp.Net Web API.当然,代码可能只是发布两个现有可绘制文件的基本示例,也不是所有情况下的最佳解决方案,也不是很好的调优.
MultipartActivity.java:
package com.example.multipartvolley;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class MultipartActivity extends Activity {
private final Context context = this;
private final String twoHyphens = "--";
private final String lineEnd = "\r\n";
private final String boundary = …Run Code Online (Sandbox Code Playgroud) 我试图让工作的URL是以下风格的网址:http://somedomain.com/api/people/staff.33311(就像网站一样,LAST.FM允许在他们的RESTFul和WebPage网址中添加所有类型的标记例如," http://www.last.fm/artist/psy'aviah "是LAST.FM的有效网址.
以下方案有效: - http://somedomain.com/api/people/ - 返回所有人 - http://somedomain.com/api/people/staff33311 - 也可以,但不是我的意思在我希望网址接受"点"后,就像下面的示例 - http://somedomain.com/api/people/staff.33311 - 但这给了我一个
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Run Code Online (Sandbox Code Playgroud)
我已经设置了以下内容:
控制器"PeopleController"
public IEnumerable<Person> GetAllPeople()
{
return _people;
}
public IHttpActionResult GetPerson(string id)
{
var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower()));
if (person == null)
return NotFound();
return Ok(person);
}
Run Code Online (Sandbox Code Playgroud)WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
// …Run Code Online (Sandbox Code Playgroud)c# asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api asp.net-web-api2
我正在使用ASP.NET MVC 5 Web Api.我想咨询我的所有用户.
我写了api/users,我收到了这个:
"'ObjectContent`1'类型无法为内容类型'application/json; charset = utf-8'"序列化响应正文
在WebApiConfig中,我已添加以下行:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Run Code Online (Sandbox Code Playgroud)
但它仍然无效.
我的返回数据函数是这样的:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义复杂类型,我想使用Web API.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的Web API控制器方法.我想像这样发布这个对象:
public class TestController : ApiController
{
// POST /api/test
public HttpResponseMessage<Widget> Post(Widget widget)
{
widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID
var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用System.Net.HttpClient来调用该方法.但是,我不确定要传递给PostAsync方法的对象类型以及如何构造它.这是一些示例客户端代码.
var client …Run Code Online (Sandbox Code Playgroud) 我想知道如何使用ASP.NET Web API实现模型验证.我的模型是这样的:
public class Enquiry
{
[Key]
public int EnquiryId { get; set; }
[Required]
public DateTime EnquiryDate { get; set; }
[Required]
public string CustomerAccountNumber { get; set; }
[Required]
public string ContactName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的API控制器中有一个Post动作:
public void Post(Enquiry enquiry)
{
enquiry.EnquiryDate = DateTime.Now;
context.DaybookEnquiries.Add(enquiry);
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
如何添加if(ModelState.IsValid)然后处理错误消息以传递给用户?
我使用vS2012创建了一个mvc4 web api项目.我使用以下教程来解决跨源资源共享问题,"http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api- RC-version.aspx".它运行成功,我成功地将数据从客户端发布到服务器.
在我的项目中实现Autherization之后,我使用以下教程来实现OAuth2,"http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/18/oauth-2-0-for -mvc两足-implementation.aspx".这有助于我在客户端获取RequestToken.
但是当我从客户端发布数据时,我得到了错误, "XMLHttpRequest无法加载http://.请求头字段Access-Control-Allow-Headers不允许Content-Type."
我的客户端代码看起来像,
function PostLogin() {
var Emp = {};
Emp.UserName = $("#txtUserName").val();
var pass = $("#txtPassword").val();
var hash = $.sha1(RequestToken + pass);
$('#txtPassword').val(hash);
Emp.Password= hash;
Emp.RequestToken=RequestToken;
var createurl = "http://localhost:54/api/Login";
$.ajax({
type: "POST",
url: createurl,
contentType: "application/json; charset=utf-8",
data: JSON.stringify(Emp),
statusCode: {
200: function () {
$("#txtmsg").val("done");
toastr.success('Success.', '');
}
},
error:
function (res) {
toastr.error('Error.', 'sorry either your username of password was incorrect.');
}
});
};
Run Code Online (Sandbox Code Playgroud)
我的api控制器看起来像,
[AllowAnonymous] …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的错误.我正在试验.NET 4.5 Web API,实体框架和MS SQL Server.我已经创建了数据库并设置了正确的主键和外键以及关系.
我创建了一个.edmx模型并导入了两个表:Employee和Department.一个部门可以有很多员工,这种关系存在.我使用scaffolding选项创建了一个名为EmployeeController的新控制器,以使用Entity Framework创建一个带有读/写操作的API控制器.在向导中,选择Employee作为模型,并选择数据上下文的正确实体.
创建的方法如下所示:
public IEnumerable<Employee> GetEmployees()
{
var employees = db.Employees.Include(e => e.Department);
return employees.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
当我通过/ api/Employee调用我的API时,出现此错误:
'ObjectContent`1'类型无法序列化内容类型'application/json的响应主体; ... ... System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生错误.","ExceptionMessage":"使用类型'System.Data.Entity.DynamicProxies检测到自引用循环.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552' .Path'[0] .Department.Employees'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"...
为什么它自引用[0] .Department.Employees?这并没有多大意义.如果我在我的数据库中进行循环引用,我希望这会发生,但这是一个非常简单的例子.怎么可能出错?
将XmlDoc集成到Web Api项目中的文档似乎只处理所有API类型都属于WebApi项目的情况.特别是,它讨论了如何将XML文档重新路由到App_Data/XmlDocument.xml取消注释配置中将使用该文件的行.这隐含地只允许一个项目的文档文件.
但是,在我的设置中,我在一个常见的"模型"项目中定义了我的请求和响应类型.这意味着如果我有一个端点,例如:
[Route("auth/openid/login")]
public async Task<AuthenticationResponse> Login(OpenIdLoginRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)
在OpenIdLoginRequest单独的C#项目中定义的位置如下:
public class OpenIdLoginRequest
{
/// <summary>
/// Represents the OpenId provider that authenticated the user. (i.e. Facebook, Google, etc.)
/// </summary>
[Required]
public string Provider { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
尽管有XML文档,但request在查看特定于端点的帮助页面(即http://localhost/Help/Api/POST-auth-openid-login)时,参数的属性不包含任何文档.
如何在Web API XML文档中显示具有XML文档的子项目中的类型?
我有一个方法,如下所示进行POST
var response = await client.PostAsJsonAsync(url, entity);
if (response.IsSuccessStatusCode)
{
// read the response as strongly typed object
return await response.Content.ReadAsAsync<T>();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何获得从实体对象发布的实际JSON.我想记录获得POSTED的JSON,所以如果没有我必须自己进行json序列化,那将是很好的.
我的路线配置正确,我的方法有装饰标签.我仍然得到"请求的资源不支持HTTP方法'GET'"消息?
[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
// Décoder les paramètres reçue.
string decodedUsername = username.DecodeFromBase64();
string decodedPassword = password.DecodeFromBase64();
return "value";
}
Run Code Online (Sandbox Code Playgroud)
这是我的路线:
config.Routes.MapHttpRoute(
name: "AuthentificateRoute",
routeTemplate: "api/game/authentificate;{username};{password}",
defaults: new { controller = "Game",
action = "Auth",
username = RouteParameter.Optional,
password = RouteParameter.Optional },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { controller = "Home", id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)